package letcode.oneQuestionPerDay._202003._20200327;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/*
卡牌分组
 */
public class GroupCard_1 {
    public static void main(String[] args) {
        int[] arr= new int[]{1, 2, 3, 4, 4, 3, 2, 1}; //true
        int[] arr1= new int[]{1,1,1,2,2,2,3,3}; //false
        int[] arr2= new int[]{1}; //false
        int[] arr3= new int[]{1,1}; //true
        int[] arr4= new int[]{1,1,2,2,2,2}; //true
        int[] arr5= new int[]{1,1,1,1,2,2,2,2,2,2}; //true
        int[] arr6= new int[]{1,1,1,2,2,2,3,3}; //fal
        int[] arr7= new int[]{1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3}; //fal

        System.out.println(hasGroupsSizeX(arr5));
    }
    //提供方法  自己解法尝试 官方题解一：暴力法
    public static boolean hasGroupsSizeX(int[] deck) {
        //得到每个数对应的数量
        int[] count=new int[10000];
        for (int i = 0; i < deck.length; i++) {
            count[deck[i]]++;
        }
        //把不为0的拿出来
        List<Integer> list=new ArrayList<>();
        for (int i:count
             ) {
            if (i!=0)
                list.add(i);
        }
        //总数是每一个数的倍数 从小到大递增的排序
        search:for (int x=2;x<=deck.length;++x){
            if (deck.length%x==0){
                for (int v:list){
                    if (v%x!=0)
                        continue search;
                }
                return true;
            }
        }
        return false;
    }

}
/*
给定一副牌，每张牌上都写着一个整数。
此时，你需要选定一个数字 X，使我们可以将整副牌按下述规则分成 1 组或更多组：
每组都有 X 张牌。
组内所有的牌上都写着相同的整数。
仅当你可选的 X >= 2 时返回 true。

示例 1：
输入：[1,2,3,4,4,3,2,1]
输出：true
解释：可行的分组是 [1,1]，[2,2]，[3,3]，[4,4]
示例 2：
输入：[1,1,1,2,2,2,3,3]
输出：false
解释：没有满足要求的分组。
示例 3：
输入：[1]
输出：false
解释：没有满足要求的分组。
示例 4：
输入：[1,1]
输出：true
解释：可行的分组是 [1,1]
示例 5：
输入：[1,1,2,2,2,2]
输出：true
解释：可行的分组是 [1,1]，[2,2]，[2,2]

提示：
1 <= deck.length <= 10000
0 <= deck[i] < 10000

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */